import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;


public class Mytest extends JFrame implements ActionListener {
    //定义两个面板
    private JPanel north, center;
    // 文本框 用于显示计算结果
    private JTextField field;
    // 定义一个按钮
    private JButton[] btns;
    //按钮文字数组
    private String[] str;
    //计算引擎
    private ScriptEngine engine;

    //无参
    //构造函数————无参(不返回) 定义 特点
    public Mytest() {
        //设置窗口标题
        setTitle("计算器");
        //设置窗口长 宽 高
        setSize(700, 900);
        //关闭窗口时结束程序
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //设置窗口的位置
        setLocation((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() - this.getWidth()) / 2,
                (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight() - this.getHeight()) / 2);
        //初始化窗口
        initComponent();
        //设置窗口可见
        setVisible(true);
    }

    //初始化窗口的方法 无参 无返回值
    //方法用于创建和配置计算器的GUI组件，包括面板、文本框和按钮，并设置它们的布局和样式。
    private void initComponent() {
        //窗口添加内容
        //创建面板
        north  = new JPanel();
        center = new JPanel();
        //设置 north 和 center 面板的背景颜色
        north.setBackground(new Color(240, 240, 240));
        center.setBackground(new Color(255, 255, 255));

        //创建文本框
        field = new JTextField();
        //设置文本框的属性
        //field.setColumns();
        //设置输入框 宽高属性
        field.setPreferredSize(new Dimension(700, 100));
        //输入框禁止编辑
        field.setEditable(false);
        //设置文本框的字体格式
        Font font = new Font("SansSerif", Font.BOLD, 25);
        //设置字体粗细
        field.setFont(font);
        //获取计算引擎
        ScriptEngineManager manager  = new ScriptEngineManager();
        engine = manager.getEngineByName("JavaScript");
        //以数组的形式声明的按钮字符
        str = new String[]{
                "7", "8", "9", "+",
                "4", "5", "6", "-",
                "1", "2", "3", "×",
                "0", ".", "T", "÷",
                "sin", "cos", "(", ")",
                "C", "B", "S", "=",

        };
        //创建按钮
        btns = new JButton[str.length];
        for (int i = 0; i < str.length; i++) {

            btns[i] = new JButton(str[i]);
            btns[i].setFont(new Font("SansSerif", Font.BOLD, 25));
            // 设置文本框的背景颜色和前景色
            field.setBackground(new Color(112,128,144)); // 灰色背景
            field.setForeground(new Color(255, 255, 255)); // 白色文字
            //设置按钮的背景颜色和前景色
            btns[i].setBackground(new Color(0, 100, 200));
            btns[i].setForeground(new Color(255, 255, 255));
            //为按钮添加边框
            btns[i].setBorder(BorderFactory.createLineBorder(new Color(150, 150, 150)));
            //如果按钮是等于号，设置特殊的颜色
            if (str[i].equals("=")) {
                btns[i].setBackground(new Color(0, 128, 0)); // 深绿色背景，例如用于等于按钮
                btns[i].setForeground(new Color(255, 255, 255)); // 白色文字
            } else if (str[i].equals("C") || str[i].equals("B") || str[i].equals("S")){
                // 清除、后退和正负按钮的颜色
                btns[i].setBackground(new Color(238,99,99)); // 红色背景
                btns[i].setForeground(new Color(255, 255, 255)); // 白色文字
            }else if (str[i].equals("T")) {
                btns[i].setBackground(new Color(152,245,255)); // 青蓝色背景
                btns[i].setForeground(new Color(255, 255, 255)); // 白色文字
            }
        }
        //设置布局
        north.setLayout(new BorderLayout());
        center.setLayout(new GridLayout(6, 4));
        //将文本框添加到上面面板
        north.add(field);
        //将btns添加到center面板
        for (int i = 0; i < btns.length; i++) {
            center.add(btns[i]);
        }
        //将面板添加到窗口
        this.add(north, BorderLayout.NORTH);
        this.add(center, BorderLayout.CENTER);
        //给按键添加事件监听器
        for (int i = 0; i < btns.length; i++) {
            btns[i].addActionListener(this);
        }
    }
         //
    public void showBtnText(String text){
        if ("C".equals(text)) {
            System.out.println("C");
            //清空输入框
            field.setText("");
        } else if ("B".equals(text)) {
            System.out.println("B");
            //删除最后一位
            if (field.getText().length() > 0) {
                //获取输入框上已有的内容，接去掉最后一位，重新设置输入框
                field.setText(field.getText().substring(0, field.getText().length() - 1));
            }
        } else if ("T".equals(text)) {
            //显示当前时间
            field.setText(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            //System.out.println("T");
        } else if ("S".equals(text)) {
            // 清除显示的时间，保留其他输入
            //首先，获取文本框 field 中的当前文本内容，并将其存储在一个名为 currentText 的字符串变量中。
            String currentText = field.getText();
            //使用 matches 方法来检查 currentText 是否与给定的正则表达式匹配。
            if (currentText.matches(".*\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.*")) {
                // 如果文本框中有时间格式的内容，则清除
                //如果 currentText 与时间戳格式匹配，则使用 replaceAll 方法来替换文本。正则表达式被替换，
                //这里替换文本是空字符串 ""，意味着匹配的文本将被完全删除。
                field.setText(currentText.replaceAll("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}", ""));
            }
        } else if ("=".equals(text)) {
            System.out.println("=");
            try {
                //获得要计算的内容
                String txt = field.getText();
                //System.out.println(txt);
                txt=txt.replaceAll("×","*").replaceAll("÷","/");
                //使用计算引擎计算结果
                Object o = engine.eval(txt);
                //计算输入框中内容
                //System.out.println(o);
                //确保结果被转换为字符串类型
                field.setText(o+"");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //添加处理sin和cos的逻辑
        else if ("sin".equals(text)) {
            //调用Math.sin()函数Double.parseDouble(field.getText()): 将文本框中的字符串转换为 double 类型。这里假设文本框中输入的是角度值。
            //Math.toRadians(): 将角度值转换为弧度值。因为在Java中，三角函数的计算是基于弧度制的。
            //Math.sin(): 计算弧度值的正弦值。
            //+ "": 将计算结果转换为字符串类型。
            //field.setText(): 将计算结果字符串设置回文本框。
            field.setText(Math.sin(Math.toRadians(Double.parseDouble(field.getText()))) + "");
        } else if ("cos".equals(text)) {
            //调用Math.cos()函数
            field.setText(Math.cos(Math.toRadians(Double.parseDouble(field.getText()))) + "");
        }
        //如果是运算符
        //保留输入框上已有的数字
        else {
            //数字，点，运算符
            String oldText = field.getText();
            field.setText(oldText + text);
        }
    }
    //重写方法
    //这个方法实现了 ActionListener 接口。
    @Override
    public void actionPerformed(ActionEvent e) {
        //输出捕获到的Action
        //将事件源对象存储在 source 变量中，方便后续操作
        System.out.println(e.getSource());
        Object source = e.getSource();
        //判断事件源对象是否是 JButton 类型。如果是，则进行后续操作
        if(source instanceof JButton) {
            //将事件源对象强制转换为 JButton 类型，以便访问按钮的属性。
            JButton btn = (JButton) source;
            System.out.println(btn);
            //获取按键的文字
            String text = btn.getText();
            //展示文字显示在文本框中
            this.showBtnText(text);
        }
    }
    public static void main(String[] args) {
                new Mytest();
    }
}


//idea
//git add *
//git commit -m "first commit"
//git push


